package modelApp

import daos.MapaMundi
import java.util.List
import model.Banco
import model.Biblioteca
import model.Club
import model.Embajada
import model.Lugar
import model.Pais
import modelApp.AbstractEditor
import org.apache.wicket.markup.html.panel.FeedbackPanel

class EditorPais extends AbstractEditor<Pais> {
	
	@Property String nombre = ""
	
	@Property var MapaMundi mapamundi
	@Property var Pais pais
	
	
	@Property var Lugar lugarSeleccionado 
	@Property var List<Lugar> opcionesLugares 
	@Property var List<Lugar> lugaresInteresantes
	
	@Property String nuevaCaracteristica
	@Property var List<String> caracteristicas
	
	
	@Property var Pais paisSeleccionado
	@Property var List<Pais> paisesPosibles
	@Property var List<Pais> conexiones
	
	
	
	new(MapaMundi _mapamundi){
		mapamundi = _mapamundi
	}
	
	
	def agregarCaracteristica(){
		caracteristicas.add(nuevaCaracteristica)
		nuevaCaracteristica = ""
	}
	
	def quitarCaracteristica(String delCaracteristica){
		caracteristicas.remove(delCaracteristica)
		
	}
	
	def agregarConexion(){
		conexiones.add(paisSeleccionado)
		paisesPosibles.remove(paisSeleccionado)
		paisSeleccionado = null
	}
	
	def quitarConexion(Pais pais){
		conexiones.remove(pais)
		paisesPosibles.add(pais)
	}
	
	def agregarLugar(){
		lugaresInteresantes.add(lugarSeleccionado)
		opcionesLugares.remove(lugarSeleccionado)
		lugarSeleccionado = null
	}
	
	def quitarLugar(Lugar lugar){
		lugaresInteresantes.remove(lugar)
		opcionesLugares.add(lugar)
	}
	
	override prepararElemento(Pais elemento) {
		pais = elemento
		nuevaCaracteristica = ""
		nombre = elemento.nombre
		lugaresInteresantes = elemento.lugaresInteresantes
		caracteristicas = elemento.caracteristicas
		conexiones = elemento.conexionesAereas
		
		paisesPosibles = mapamundi.paises
		paisesPosibles.remove(elemento)
		paisesPosibles = paisesPosibles.filter[!conexiones.contains(it)].toList
		
		opcionesLugares = newArrayList => [
			add(new Biblioteca)
			add(new Club)
			add(new Banco)
			add(new Embajada)
		]
		
	}
	
	override save() {
		pais.nombre = nombre
		mapamundi.agregar(pais)
	}
	
	override validate(FeedbackPanel fbpanel) {
		validateLugares(fbpanel)
		validateCaracteristicas(fbpanel)
		validateConexiones(fbpanel)
	}
	
	def validateLugares(FeedbackPanel fbpanel){
		if(lugaresInteresantes.isEmpty && !hayLugaresRepetidos
			&& lugaresInteresantes.size < 4)
			
			fbpanel.error("Debe agregar un lugar")
	}
	
	def validateCaracteristicas(FeedbackPanel fbpanel){
		if(caracteristicas.isEmpty)
			fbpanel.error("Debe agregar una caracteristica")
	}
	
	def validateConexiones(FeedbackPanel fbpanel){
		if(conexiones.isEmpty)
			fbpanel.error("Debe agregar conexiones a otros paises")
	}
	
	private def boolean hayLugaresRepetidos(){
		lugaresInteresantes.toSet.size.equals(lugaresInteresantes.size)
	}
}